// spooling.h
// Created by fyniny on 12/23/18.
//
#include "fsys.h"
#include "base.h"
#include <sstream>
#ifndef SPOOLING_SPOOLING_H
#define SPOOLING_SPOOLING_H
// 输出井状态字
constexpr auto OUTPUT_FULL = 1;
constexpr auto OUTPUT_EMPTY = -1;
constexpr auto OUTPUT_RUNNING = 0;
class spooling :public Base{
    // 输出请求队列
    ReqBlock m_reqblock[MAX_OUTPUT_BLOCK];
    Buffer m_reqBuffer[MAX_OUTPUT_BLOCK];
    int m_in;	// 输入指针
    int m_out;	// 输出指针
    int m_req_status; // 输出队列状态，直接关联假脱机状态
    map<int, list<Buffer>> m_buffer; // 假脱机输出的位置之一
    std::stringstream outBuffer; // 假脱机输出的位置之一
public:
    bool isEmpty();
    bool isFull() ;
    spooling(int max_output,PCB pcb) ;
public:
    // 输出程序
    void Output() ;
private:
    // 添加进输出队列
    int pushReqBlock(ReqBlock& req,Buffer& buffer) ;
    // 获取队首对象引用
    ReqBlock& frontReqBlock(Buffer** buffer);
    // 弹出队首
    void popReqBlock() ;
public:
    // 假脱机运行函数
    void run(void* arg_process) final ;
    // 接收请求接口
    int request(ReqBlock& req, Buffer& buffer) final;
public:
    // 退出时在输出顺序打印至文件(out.txt)
    ~spooling() final;
};
#endif //SPOOLING_SPOOLING_H
